iT邦幫忙

3

用Python結合Open Cv建立簡易圖片辨識

  • 分享至 

  • xImage
  •  

使用python製作簡易OpenCV影像辨識的小實作,有提供Pycharm及Spyder的opencv庫安裝方式,後續將實作Androidstudio安卓系統與OpenCV結合的APP,以下言論純個人分享,如有大神能建議及改善的地方非常歡迎留言!!!
開發流程:

  1. 使用Pycharm、Spyder安裝OpenCV庫
  2. 引入OpenCV庫(圖像、視頻處理)、Nympy庫(陣列數值計算)及導入下載圖片
  3. 灰階(使用opencv運算COLOR_BGR2GRAY)
  4. 二值化(Threshold)
  5. 邊緣化Canny
  6. 膨脹/侵蝕

使用Pycharm、Spyder安裝OpenCV庫

  • Pycharm
    pip install numpy
    pip install opencv-python
    下載失敗時可重新安裝
    pip uninstall numpy
    pip uninstall opencv-python
  • Spyder (Anaconda)
    到此位置安裝
    pip install numpy
    pip install opencv-python
    https://ithelp.ithome.com.tw/upload/images/20240523/20167256WUBrILCDDp.png

開始實作前須先了解OpenCV圖像處理

  • 灰階(Grayscale):將色彩圖片轉成0~255的灰色圖片,而中間的數值表示不同程度的灰色,0表黑色,255表白色。
  • 二值化(Threshold):將圖片轉成只有兩種顏色的圖像,黑、白。通常會先灰階後,再由0~255內定義閥值及最大值255,大於閥值=255白色,小時閥值0黑色。
  • 邊緣化(Canny):檢測圖片中的邊緣,進行高斯濾波(GaussianBlur)處理,減少細節,讓邊緣化準確率提高。
  • 膨脹(Dilate):增強特定區域的範圍,使特定區域變大膨脹,其目的是填補之間縫隙與小孔。
  • 侵蝕(Erode):與膨脹相反,其目的是將兩者相連更好分開。
  • 輪廓(contours):代表了物體的外形或邊界,常使用輪廓來描述物體的形狀、計算物體的面積、計算物體的矩形或圓形等。
  • 矩形框(Rectangles):包圍物體或物體的輪廓,需要先找到物體的輪廓,然後才能計算或劃出矩形框。
  • Canny 邊緣檢測和輪廓是圖像處理中兩個不同的概念,Canny前者,輪廓後者。

  • 引入OpenCV庫(圖像、視頻處理)、Nympy庫(陣列數值計算)及導入下載圖片
    import cv2
    import numpy as np
    提供圖片使用:https://ithelp.ithome.com.tw/upload/images/20240523/20167256bRBAYhAOsb.jpg
  • 將圖片匯入並顯示
import cv2
img = cv2.imread("E:/2024_NTNU/Python/NN.JPG")
img = cv2.resize(img, (700, 500))
cv2.imshow("image1", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

imread:讀取圖片位置("X:/../../../XX.JPG")
resize:將圖片轉成自己調整的大小(寬,高)
imshow:顯示圖片("image1"標題框, img定義的圖片名變數)
waitKey:無限等待時間,這個沒打圖片會消失or當機
cv2.destroyWindows(Windows_name):刪除單一指定影像視窗
cv2.destroyAllWindows():刪除所有Open Cv影像視窗

  • 灰階(使用opencv運算COLOR_BGR2GRAY)
import cv2
img = cv2.imread("E:/2024_NTNU/Python/NN.JPG")
img = cv2.resize(img, (700, 500))
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("image1", gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

gray_img為灰階後的圖片
https://ithelp.ithome.com.tw/upload/images/20240523/20167256ECNCWXUxBJ.png

  • 二值化(Threshold)
    binary_img = cv2.threshold(gray_img, 128, 255, cv2.THRESH_BINARY)[1]
    使用threshold會返回兩個值,[0]是原本的灰階後圖片,[1]是二值化後的圖片
    也可以寫成
    _, binary_img = cv2.threshold(gray_img, 128, 255, cv2.THRESH_BINARY)
    記得底下cv2.imshow("image1", img)的img改成你定義的圖片
    https://ithelp.ithome.com.tw/upload/images/20240523/20167256qcLKti9nx5.png

  • Canny邊緣化

import cv2
img = cv2.imread("E:/2024_NTNU/Python/NN.JPG")
img = cv2.resize(img, (700, 500))
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
canny_img = cv2.Canny(gray_img, 60, 0)
cv2.imshow("image1", canny_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

圖片邊緣=與周圍像素質差很大(圖片,最低門檻值(200以下過濾),最高門檻值(超過當邊緣))
可以自行設定閥值
https://ithelp.ithome.com.tw/upload/images/20240523/20167256dWE7Lj4dcD.png

  • 膨脹
    需要使用到import numpy as np矩陣運算
import cv2
import numpy as np
kernel = np.ones((5, 5), np.uint8)
img = cv2.imread("E:/2024_NTNU/Python/NN.JPG")
img = cv2.resize(img, (700, 500))
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
canny_img = cv2.Canny(gray_img, 60, 0)
dilate = cv2.dilate(canny_img, kernel, iterations=1)
cv2.imshow("image1", dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

kernel = np.ones((5, 5), np.uint8)
使用創建NumPy庫中的np.ones創建一個5*5正方形結構(5行5列)
dilate = cv2.dilate(canny_img, kernel, iterations=1)
膨脹效果=邊緣線條變粗(圖片,2微陣列的和(np),膨脹次數)
https://ithelp.ithome.com.tw/upload/images/20240523/20167256tf3oDnjKcj.png

  • 侵蝕
    eroded_img = cv2.erode(canny_img, kernel, iterations=0)
    侵蝕效果=邊緣線條變細(圖片,2微陣列的和(np),侵蝕次數)
    canny_img未膨脹過的:iterations我用成1就都讀不到了
    dilate = cv2.dilate(canny_img, kernel, iterations=1)
    eroded_img = cv2.erode(dilate, kernel, iterations=2)
    這是先經由膨脹後再決定侵蝕程度
    https://ithelp.ithome.com.tw/upload/images/20240523/20167256LHoAw5Nsum.png
    *希望各位大大都能成功!!!
    以上言論是我自己所定義的沒有完全是對的,如有大神能建議及改善的地方非常歡迎留言!!!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言